package com.cool.shark.service.Impl;

import com.cool.shark.ex.ServiceException;
import com.cool.shark.mapper.UserMapper;
import com.cool.shark.pojo.dto.UserChangeDto;
import com.cool.shark.pojo.dto.UserChangebyIdDto;
import com.cool.shark.pojo.dto.UserDto;
import com.cool.shark.pojo.entity.User;
import com.cool.shark.service.UserService;
import com.cool.shark.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;

/**
 * @Name: UserServiceImpl
 * @Author: 西风残叶
 * @Date: 2024/3/31 13:21
 * @Version: 1.0
 * @TODO: user service 的业务实现类
 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    /**
     * 密码加密器
     */
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    @Autowired
    private UserMapper mapper;
    @Autowired
    private HttpSession session;
    /**
     * 添加用户信息。
     *
     * @param userDto 用户数据传输对象，包含用户详细信息。
     *                该方法将用户信息保存到系统中，不返回任何结果。
     */
    @Override
    public void addUser(UserDto userDto) {
        log.info("添加用户信息：{}", userDto);
        String username = userDto.getUsername();
        // 校验用户名是否是手机号码
        boolean matches = username.matches("^(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57]|19[1-9])[0-9]{8}$");
        if (!matches) {
            String message = "手机号码不符合规则";
            throw new ServiceException(ServiceCode.ERR_SERVICE_UNAVAILABLE,message);
        }
        // 校验用户是否存在
        User getUser = mapper.getByUsername(username);
        if (getUser != null) {
            String message = "用户名已存在,请前往登录";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST,message);
        }
        // 创建user对象
        User user = new User();
        // 将userDto中的数据复制到user对象中
        BeanUtils.copyProperties(userDto,user);
        // 设置默认昵称
        user.setNickname(username+"@13215hdfjbjla");
        // 密码加密加密处理
        String password = encoder.encode(user.getPassword());
        // 将加密密码设置到user对象中
        user.setPassword(password);
        log.info("user = {}",user);
        // 调用mapper的insert方法，将user对象保存到数据库中
        int rows = mapper.insert(user);
        // 判断是否添加成功
        if (rows != 1) {
            String message = "添加用户信息失败";
            throw new ServiceException(ServiceCode.ERR_INTERNAL_SERVER,message);
        }
        log.info("添加用户信息成功");
    }


    /**
     * 登录功能的实现。
     * 该方法接收一个用户信息对象（UserDto），用于验证用户身份并执行登录操作。
     *
     * @param userDto 用户信息对象，包含登录所需的用户标识和凭证等信息。
     *                用户信息对象的具体属性和结构由UserDto定义。
     * @return 无返回值。登录操作的结果通常通过其他方式（如日志、界面提示）呈现。
     */
    @Override
    public User login(UserDto userDto) {
        log.info("开始处理用户登录业务..：{}", userDto);
        String name = userDto.getUsername();
        if (name == null) {
            String message = "用户名不能为空";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST,message);
        }
        User byUsername = mapper.getByUsername(name);
        if (byUsername == null) {
            String message = "用户名不存在";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST,message);
        }
        if (!encoder.matches(userDto.getPassword(),byUsername.getPassword())) {
            String message = "密码错误";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST,message);
        }
        log.info("用户登录成功");
        return byUsername;
    }

    /**
     * 计算用户数量。
     * 该方法不接受参数，通过调用mapper对象的count方法来获取用户数量，然后将数量返回。
     *
     * @return int 返回用户数量。
     */
    @Override
    public int countUsers() {
        log.info("开始处理用户数量业务");
        int count = mapper.count();
        return count;
    }


    /**
     * 计算购物车中的商品数量。
     *
     * @return 返回购物车中商品数量的整型值。
     */
    @Override
    public int cartCount() {
        int count = mapper.cartCountCartById();
        return count;
    }

    @Override
    public void changePassword(UserChangeDto userDto) {
        log.info("开始处理修改密码业务,参数:{}",userDto);
        String oldPassword = userDto.getOldPassword();
        UserDto userVO = mapper.selectById(userDto.getId());
        if (!encoder.matches(oldPassword,userVO.getPassword())) {
            String message = "旧密码错误";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST,message);
        }
        if (!userDto.getNewPassword().equals(userDto.getConfirmPassword())) {
            String message = "两次密码输入不一致";
            throw new ServiceException(ServiceCode.ERR_BAD_REQUEST,message);
        }
        UserChangebyIdDto user = new UserChangebyIdDto();
        user.setId(userDto.getId());
        user.setNickname(userDto.getNickname());
        user.setPassword(encoder.encode(userDto.getNewPassword()));
        log.info("user = {}",user);
        int i = mapper.updateById(user);
        log.info("i = {}",i);
        if (i != 1) {
            String message = "修改个人信息失败";
            throw new ServiceException(ServiceCode.ERR_INTERNAL_SERVER,message);
        }
        log.info("修改个人信息成功");
    }
}